home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
diskdup
/
option.c
< prev
next >
Wrap
Text File
|
1994-06-01
|
9KB
|
392 lines
/********************************************************************
* *
* DISKDUP *
* *
* オンメモリ型 DISKCOPY *
* *
* diskdup.exp *
* *
* for FM-TOWNS *
* *
* Copyright (c) ちにゃと & Tymic 1992. 1993. *
* *
* OPTION ソース *
* *
********************************************************************/
#define __OPT__ /* ファイル ID */
/********************************************************************
インクルードファイル
*********************************************************************/
/* HI-C ライブラリ ヘッダー */
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <stat.h>
#include <string.h>
#include <memory.h>
/* ソース ヘッダー */
#include "diskdup.h"
#include "ddupgui.h"
#include "option.h"
/********************************************************************
変数
*********************************************************************/
static ulong pan;
static ulong dtlong;
static char fname[256]; /* ファイル 名 バッファ */
static char Headdata[32]; /* ファイル ヘッダー バッファ */
static char Disk_2HD_120[32] = "DISKDUP MFM 2HD 1024B/S 8S 154T ";
static char Disk_2DD_720[32] = "DISKDUP MFM 2DD 720B/S 9S 160T ";
static char Disk_2DD_640[32] = "DISKDUP MFM 2DD 640B/S 8S 160T ";
static char Disk_2HC_120[32] = "DISKDUP MFM 2HC 512B/S15S 160T ";
int flagld = 0; /* ロード 指定 フラグ */
int flagsv = 0; /* セーブ 指定 フラグ */
int flagfmt = 0; /* フォーマット 指定 フラグ */
int flagipt = 0; /* エラー無視 指定 フラグ */
int flagerr = 0; /* オプション エラー フラグ */
/************************************************************
【オプション解析】
概要 オプションパラメ-タの解析を行い結果を返す
用法 optionset( argc, argv );
引数 int argc
char *argv[]
戻り値 int 0 オプション無し
-1 オプションの指定が正しくない
-2 ヘルプを表示
ビットが立っていない場合 立っている場合
bit 0 デ-タファイルをロ-ドしない / デ-タファイルをロ-ドする
1 デ-タファイルを作成しない / デ-タファイルを作成する
2* フォ-マットを選択する / フォ-マットをしない
3* フォ-マットを選択する / フォ-マットをする
4 入力を求める / エラ-時以外は入力を求めない
注意 bit2 = 0 && bit3 = 0 の時のみフォ-マットを選択する
************************************************************/
int optionset( int argc, char *argv[] )
{
int ret = 0;
int count;
char c;
/* オプション パラメータ 解析 */
if ( argc > 1 ) {
for ( count = 1; count < argc; count++ ) {
if ( ( ret != -1 ) && (ret != -2 ) ) {
c = *argv[count];
/* debug ****
strcpy( str, argv[count] );
putmessage();
ready();
/****/
if ( c == '/' || c == '-' ) {
c = *(argv[count] + 1);
switch ( c ) {
case 'h':
case 'H':
case '?':
ret = -2;
break;
case 'l':
case 'L':
flagld = 1;
ret |= 1;
break;
case 's':
case 'S':
flagsv = 1;
ret |= 2;
break;
case 'f':
case 'F':
flagfmt = 2;
ret |= 8;
break;
case 'd':
case 'D':
flagfmt = 1;
ret |= 4;
break;
case 'i':
case 'I':
flagipt = 1;
ret |= 16;
break;
/* 無効 パラメータ */
default:
ret = -1;
}
}
else {
strcpy(fname, argv[count] );
/* debug ****
strcpy( str, fname );
putmessage();
/****/
}
} /* if ret */
} /* for count */
} /* if argc */
return ret;
}
/***************************************************************
【デ-タファイルを読み込む】
概要
用法 loaddata();
引数 char *Data
戻り値 int 0 : 成功
-1 : 失敗
!0 or !-1 : diskのフォ-マットの種類
注意 無し
***************************************************************/
int loaddata ( char *Data )
{
int ret = 0;
int rsize;
if ( access( fname, 0 ) != 0 ) {
flagerr = 1;
strcpy( str, "デ-タファイルが見つかりません。" );
putmessage();
ready();
ret = -1;
flagerr = 0;
}
else {
pan = _open( fname, _O_BINARY | _O_RDWR );
if ( pan == -1 ) {
flagerr = 1;
strcpy( str, "ファイルのオ-プンに失敗しました。" );
putmessage();
ready();
ret = -1;
flagerr = 0;
}
rsize = _read( pan, Headdata, 32 );
if ( rsize == -1 || rsize != 32 ) {
flagerr = 1;
strcpy( str, "ヘッダの読み込みに失敗しました。" );
putmessage();
ready();
_close( pan );
ret = -1;
flagerr = 0;
}
if ( strncmp( Headdata, "DISKDUP ", 8 ) != 0 ) {
flagerr = 1;
strcpy( str, "DISKDUPのデ-タファイルではありません。" );
putmessage();
ready();
_close( pan );
ret = -1;
flagerr = 0;
}
else {
if (( ret = gethead() ) != -1 ) {
rsize = _read( pan, Data, dtlong );
}
if ( rsize == -1 || rsize != dtlong || ret == -1 ) {
flagerr = 1;
_close( pan );
strcpy( str, "デ-タファイルの読み込みに失敗しました。" );
putmessage();
ready();
ret = -1;
flagerr = 0;
}
else {
_close(pan);
}
}
}
return ret;
}
/***************************************************************
【デ-タファイルを作成する】
概要
用法 savedata();
引数 無し
戻り値 int 0 : 成功
-1 : 失敗
注意 無し
***************************************************************/
int savedata ( char *Data, int sw )
{
int ret = 0;
int wsize;
if ( _access( fname, 0 ) == 0 ) {
flagerr = 1;
strcpy( str, "同名のファイルがあります。上書きして良いですか。" );
putmessage();
if ( select() == 1 ) {
ret = -1;
}
}
flagerr = 0;
if ( ret == 0 ) {
pan = _open( fname,_O_BINARY | _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE );
if ( pan == -1 ) {
ret = -1;
}
if ( ret == 0 ) {
makehead( sw );
wsize = _write( pan, Headdata, 32 );
if ( wsize == -1 || wsize != 32 ) {
flagerr = 1;
strcpy( str, "ヘッダの書き込みに失敗しました。" );
putmessage();
ready();
_close( pan );
ret = -1;
flagerr = 0;
}
}
if ( ret == 0 ) {
wsize = _write( pan, Data, dtlong );
if ( wsize == -1 || wsize != dtlong ) {
flagerr = 1;
strcpy( str, "デ-タの書き込みに失敗しました。" );
putmessage();
ready();
_close( pan );
_unlink( fname );
ret = -1;
flagerr = 0;
}
else {
_close( pan );
}
}
}
return ret;
}
/**********************************************************
【ヘッドデ-タを作る】
概要
用法 makehead( sw );
引数 int sw : ヘッダー タイプ TYPE_2HD_12
TYPE_2DD_720
TYPE_2DD_640
TYPE_2HC_12
戻り値 無し
注意 変化する変数 char Headdata[]
**********************************************************/
void makehead( int sw )
{
switch ( sw ) {
case TYPE_2DD_720:
strncpy( Headdata, Disk_2DD_720, 32 );
dtlong = SECLEN512 * MAXSEC_720 * MAXCYL_2DD * MAXHEAD;
break;
case TYPE_2DD_640:
strncpy( Headdata, Disk_2DD_640, 32 );
dtlong = SECLEN512 * MAXSEC_640 * MAXCYL_2DD * MAXHEAD;
break;
case TYPE_2HC_12:
strncpy( Headdata, Disk_2HC_120, 32 );
dtlong = SECLEN512 * MAXSEC_12C * MAXCYL_2HC * MAXHEAD;
break;
case TYPE_2HD_12:
default:
strncpy( Headdata, Disk_2HD_120, 32 );
dtlong = SECLEN1024 * MAXSEC_12 * MAXCYL_2HD * MAXHEAD;
break;
}
}
/**********************************************************
【ヘッドデ-タからディスクタイプを得る】
概要
用法 gethead();
引数 無し
戻り値 int -1 : エラ-
TYPE_2HD_12 : 1.2M 2HD
TYPE_2DD_720 : 720K 2DD
TYPE_2DD_640 : 640K 2DD
TYPE_2HC_12 : 1.2M 2HC
注意 無し
**********************************************************/
int gethead( void )
{
int disktypes;
if ( strncmp( Headdata, Disk_2HD_120, 32 ) == 0 ) {
disktypes = TYPE_2HD_12;
dtlong = SECLEN1024 * MAXSEC_12 * MAXCYL_2HD * MAXHEAD;
flagerr = 1;
strcpy( str, "1.2M 2HD" );
putmessage();
flagerr = 0;
} else if ( strncmp( Headdata, Disk_2DD_720, 32 ) == 0 ) {
disktypes = TYPE_2DD_720;
dtlong = SECLEN512 * MAXSEC_720 * MAXCYL_2DD * MAXHEAD;
flagerr = 1;
strcpy( str, "720K 2DD" );
putmessage();
flagerr = 0;
} else if ( strncmp( Headdata, Disk_2DD_640, 32 ) == 0 ) {
disktypes = TYPE_2DD_640;
dtlong = SECLEN512 * MAXSEC_640 * MAXCYL_2DD * MAXHEAD;
flagerr = 1;
strcpy( str, "640K 2DD" );
putmessage();
flagerr = 0;
} else if ( strncmp( Headdata, Disk_2HC_120, 32 ) == 0 ) {
disktypes = TYPE_2HC_12;
dtlong = SECLEN512 * MAXSEC_12C * MAXCYL_2HC * MAXHEAD;
flagerr = 1;
strcpy( str, "1.2M 2HC" );
putmessage();
flagerr = 0;
} else {
disktypes = -1;
}
return disktypes;
}
/* end of file */